package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
)

func main() {
	if len(os.Args) < 2 {
		fmt.Fprintf(os.Stderr, "Usage: %s <dir>\n", os.Args[0])
		return
	}
	fi, e := ioutil.ReadDir(os.Args[1])
	if e != nil {
		log.Fatal(e)
	}
	for _, f := range fi {
		switch {
		case f.Mode().IsRegular():
			fmt.Printf("-    %-13s %-10d %s\n", f.Mode().Perm(), f.Size(), f.Name())
		case f.Mode()&os.ModeDir == os.ModeDir:
			fmt.Printf("d    %-13s %-10d %s\n", f.Mode().Perm(), f.Size(), f.Name())
		case f.Mode()&os.ModeSymlink == os.ModeSymlink:
			fmt.Printf("l    %-13s %-10d %s\n", f.Mode().Perm(), f.Size(), f.Name())
		case f.Mode()&os.ModeSocket == os.ModeSocket:
			fmt.Printf("s    %-13s %-10d %s\n", f.Mode().Perm(), f.Size(), f.Name())
		case f.Mode()&os.ModeDevice == os.ModeDevice:
			fmt.Printf("c/b  %-13s %-10d %s\n", f.Mode().Perm(), f.Size(), f.Name())
		case f.Mode()&os.ModeNamedPipe == os.ModeNamedPipe:
			fmt.Printf("p    %-13s %-10d %s\n", f.Mode().Perm(), f.Size(), f.Name())
		default:
			fmt.Printf("%s: Unknown file type\n", f.Name())
		}
	}
}
